/**
 * 请勿将俱乐部专享资源复制给其他人，保护知识产权即是保护我们所在的行业，进而保护我们自己的利益
 * 即便是公司的同事，也请尊重 JFinal 作者的努力与付出，不要复制给同事
 * <p>
 * 如果你尚未加入俱乐部，请立即删除该项目，或者现在加入俱乐部：http://jfinal.com/club
 * <p>
 * 俱乐部将提供 jfinal-club 项目文档与设计资源、专用 QQ 群，以及作者在俱乐部定期的分享与答疑，
 * 价值远比仅仅拥有 jfinal club 项目源代码要大得多
 * <p>
 * JFinal 俱乐部是五年以来首次寻求外部资源的尝试，以便于有资源创建更加
 * 高品质的产品与服务，为大家带来更大的价值，所以请大家多多支持，不要将
 * 首次的尝试扼杀在了摇篮之中
 */

package com.jfinal.ssl;

import com.github.benmanes.caffeine.cache.Caffeine;
import com.jfinal.aop.Aop;
import com.jfinal.config.*;
import com.jfinal.json.MixedJsonFactory;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.cron4j.Cron4jPlugin;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.ssl.common.CaffeineKit;
import com.jfinal.ssl.controller.SslServer;
import com.jfinal.template.Engine;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.util.Arrays;

/**
 * JFinalClubConfig
 */
public class JFinalMain extends JFinalConfig {

    // 使用 jfinal-undertow 时此处仅保留声明，不能有加载代码
    private static Prop p;

    /**
     * 启动入口，运行此 main 方法可以启动项目，此 main 方法
     * 可以放置在任意的 Class 类定义中，不一定要放于此
     */
    public static void main(String[] args) {
        UndertowServer.start(JFinalMain.class);
    }

    /**
     * PropKit.useFirstFound(...) 使用参数中从左到右最先被找到的配置文件
     * 从左到右依次去找配置，找到则立即加载并立即返回，后续配置将被忽略
     */
    static void loadConfig() {
        if (p == null) {
            p = PropKit.useFirstFound("config.txt", "config-dev.txt");
            SslServer.SecretId = p.get("SecretId");
            SslServer.SecretKey = p.get("SecretKey");
            SslServer.ServiceType = p.get("ServiceType");
            SslServer.NearlyDay = p.getInt("NearlyDay",7);//默认7天
            SslServer.path = p.get("path");
            String doMain = p.get("doMain");
           if(StrKit.notBlank(doMain)){
                SslServer.DoMainList = Arrays.asList(doMain.split(";"));
            }
        }
    }

    public void configConstant(Constants me) {
        loadConfig();

        me.setDevMode(p.getBoolean("devMode", false));
        //me.setJsonFactory(MixedJsonFactory.me());

        // 支持 Controller、Interceptor、Validator 之中使用 @Inject 注入业务层，并且自动实现 AOP
        me.setInjectDependency(true);

        // 是否对超类中的属性进行注入
        me.setInjectSuperClass(true);
    }

    public void configRoute(Routes me) {
        /**
         * 扫描后台路由
         */
        me.add(new Routes() {
            public void config() {
                // 添加后台管理拦截器，将拦截在此方法中注册的所有 Controller
                // undertow.hotSwapClassPrefix = com.jfinal.club._admin.
                this.scan("com.jfinal.ssl.");
            }
        });
    }

    /**
     * 配置模板引擎，通常情况只需配置共享的模板函数
     */
    public void configEngine(Engine me) {
        me.setDevMode(p.getBoolean("engineDevMode", false));
    }

    public void configPlugin(Plugins me) {
      me.add(new Cron4jPlugin(p));
    }

    public void configInterceptor(Interceptors me) {
    }

    public void configHandler(Handlers me) {
    }

    /**
     * 本方法会在 jfinal 启动过程完成之后被回调，详见 jfinal 手册
     */
    public void onStart() {
        // 1. 先设置持久化路径 设置缓存持久化路径 (使用Web根目录下的cache目录)
        String cachePath = PathKit.getWebRootPath() + "/data/cache/";
        CaffeineKit.setPersistenceBasePath(cachePath);

        // 2. 创建特殊缓存实例（在加载数据前创建）
        CaffeineKit.putCache("cacheData",
                Caffeine.newBuilder()
                        .maximumSize(100000)
                        .build());

        // 3. 最后加载持久化数据（会自动填充已创建的缓存）
        CaffeineKit.loadAllFromDisk();
        //启动就检测一下SSL证书
        SslServer sslServer = Aop.get(SslServer.class);
        try {
            sslServer.doMain();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (CertificateException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 服务关闭时回调 onStop()
    public void onStop() {
        // 1. 确保缓存持久化
        CaffeineKit.persistAll(); // 新增关键代码
    }
}






